package com.design_patterns.singleton;

/**
 * @author: 李德才
 * @description:
 * @create: 2020-08-23 15:30
 **/

/**
 * 懒加载（懒汉模式）
 * 目的：按需加载
 * 线程不安全
 */
public class LazyLoading {
    private static LazyLoading INSTANCE;
    private LazyLoading() {}

    public static LazyLoading getInstance() {
        if (INSTANCE == null) {
            /**
             * 但是如果当第一个线程在创建对象但是还没有创建成功，第二个线程进来，
             * 就会创建两个对象，这就是线程不安全的地方
             */
            try {
                //模拟初始化过程浪费的时间
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            /**
             * thread_2:我就在thread_1上面，
             * INSTANCE 为空时我进来的，
             * 等thread_1创建完了我也会创建创建一次，
             * 系统中就存在两个INSTANCE对象了
             *
             * thread_1：我在这，我现在要创建对象
             */
            INSTANCE = new LazyLoading();
        }
        return INSTANCE;
    }

    /**
     * 检查对象的hashCode 是否一致来判断是否是相同的对象
     * @param args
     */
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                System.err.println(LazyLoading.getInstance().hashCode());
            }).start();
        }
    }
}
